<?php

namespace wechat\src;

/**
 * 微信操作接口类
 */
abstract class SrcAbstract {

    /**
     * 微信入口类实例对象
     * @var type 
     */
    public $wechat;

    /**
     * 动态设置类属性
     * @param string $name 属性名称
     * @param mixed $value 属性值
     */
    public function __set($name, $value) {
        $this->$name = $value;
    }

    /**
     * 取得动态设置的属性值
     */
    public function __get($name) {
        if (empty($this->$name)) {
            return "";
        }
        return $this->$name;
    }

    /**
     * 错误信息设置
     */
    protected function setError($code, $msg) {
        $this->errcode = $code;
        $this->errmsg = $msg;
    }

    /**
     * 获取错误编码
     */
    public function getErrCode() {
        return $this->errcode;
    }

    /**
     * 获取错误信息
     */
    public function getErrMsg() {
        return $this->errmsg;
    }

    /**
     * 生成签名
     * @param array $values 需要签名的数据对象
     * @param string $key 名称需要拼接的字符串KEY
     * @return 签名，本函数不覆盖sign成员变量，如要设置签名需要调用SetSign方法赋值
     */
    public function MakeSign($values, $key = "") {
        //签名步骤一：按字典序排序参数
        ksort($values);
        $string = $this->ToUrlParams($values);
        //签名步骤二：在string后加入KEY
        if (!empty($key)) {
            $string = $string . "&key=" . $key;
        }
        //签名步骤三：MD5加密或者HMAC-SHA256
        $string = md5($string);
        //签名步骤四：所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }

    /**
     * 格式化参数格式化成url参数
     */
    public function ToUrlParams($values) {
        $buff = "";
        foreach ($values as $k => $v) {
            if ($k != "sign" && $v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }

}
